"""
文件名:Base.py
作用:对selenium进行二次封装
    1. 打开浏览器(单独封装)
    2. 访问网址
    3. 元素定位
    4. 元素操作
    5. 控件操作
"""

# 导入需要的包
from time import sleep
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


# 打开浏览器默认为谷歌
def open_browser(browser="chrome"):
    """
    通过浏览器名称, 打开对应的浏览器
    :param browser: 浏览器名称
    :return: 返回driver类或None
    :lower():将字符串只转换为小写,本就是小写不变
    """
    # 如果browser等于chrome为真
    if browser.lower() == "chrome":
        # 就返回chrome
        return webdriver.Chrome()
    # 如果browser等于firefox为真
    elif browser.lower() == "firefox":
        # 就返回firefox
        return webdriver.Firefox()
    # 如果browser等于edge为真
    elif browser.lower() == "edge":
        # 就返回edge
        return webdriver.Edge()
    # 否则
    else:
        # 打印请输入正确的浏览器名称，例如：Chrome、Firefox、Edge
        print("请输入正确的浏览器名称，例如：Chrome、Firefox、Edge")
        # 返回None
        return None


# 设置函数_find_element  locator默认元组timeout定时10秒
def _find_element(self, locator: tuple, timeout=10):
    # 判断
    try:
        # 返回显式等待driver运行10秒后
        return WebDriverWait(self._driver, timeout).until(EC.presence_of_element_located(locator))
    except:
        # 报错就打印locator后返回False
        print(f"元素{locator}没有找到")
        return False


def _find_elements(self, locator: tuple, timeout=10):
    try:
        return WebDriverWait(self._driver, timeout).until(EC.presence_of_all_elements_located(locator))
    except:
        print(f"元素{locator}没有找到")
        return False


# 默认继承object:基类、超类
# 创建Base类
class Base(object):
    # 必传参数driver,传入浏览器参数
    def __init__(self, driver):
        self._driver = driver

    # ufl为必传参数
    def get_url(self, ufl):
        """
        访问网址
        :param ufl: 网址链接 例:http://www.xxx.com
        :return:
        """
        # 判断以"http://"或“https://”开头
        if ufl.startswith("http://" or "https://"):
            # 窗口最大化
            self._driver.maximize_window()
            # 访问网址
            self._driver.get(ufl)
        else:
            # 不满足以上条件就输出"请输入正确格式的网址"
            print("请输入正确格式的网址")

    def close_browser(self):
        """
        关闭浏览器
        :return:
        """
        self._driver.quit()


# 判断name=main,执行代码块
if __name__ == '__main__':
    base = Base(open_browser())
    base.get_url("http://www.baidu.com")
    sleep(5)
    base.close_browser()
